=========================================================
Das XDL-Steuerwort der VBXE
=========================================================
INHALT
1. Grundidee: Wie die VBXE die XDL liest
2. Die Schalterbank im Überblick
3. Jedes Bit im Detail (Bit 0 bis Bit 15)
4. Typische Kombinationen
5. Häufige Fehler
6. Kurz-Spickzettel
==============================================================================
1. GRUNDIDEE: WIE DIE VBXE DIE XDL LIEST
==============================================================================
Die XDL (eXtended Display List) ist eine Liste von Befehlen im VRAM der VBXE.
Jeder Befehl besteht aus:
- einem Steuerwort (16 Bit = 2 Bytes)
- und danach, je nach eingeschalteten Bits, 0 bis viele Zusatz-Bytes
Am Anfang jedes Bildes springt die VBXE an die Adresse, die in XDL_ADR
($D641-$D643) steht, und liest den ersten Befehl. Sie führt ihn für eine
oder mehrere Bildzeilen aus und liest dann den nächsten Befehl. Das geht so
weiter, bis ein Befehl mit gesetztem END-Bit fertig ist.
Man kann sich das Steuerwort wie eine Reihe von 16 Schiebeschaltern
vorstellen:
Schalter oben = Bit 1 = an
Schalter unten = Bit 0 = aus
Es gibt zwei Sorten Schalter:
a) Reine Schalter: Sie schalten etwas ein oder aus. Danach folgt nichts.
(TMON, GMON, OVOFF, MAPON, MAPOFF, HR, LR, END)
b) Daten-Schalter: Sie sagen "hinter mir kommen noch Bytes".
(RPTL, OVADR, OVSCRL, CHBASE, MAPADR, MAPPAR, OVATT)
Die Zusatz-Bytes stehen IMMER in der Reihenfolge der Bits, von Bit 0
aufwärts. Schalter, die unten sind, werden übersprungen.
Wichtig: Was ein Befehl einstellt (Adresse, Zeichensatz, Farben ...), bleibt
in der Regel für die folgenden Befehle gültig, bis es wieder geändert
wird. Darum muss man nicht in jedem Befehl alles neu angeben.
Im Speicher steht das Steuerwort wie beim 6502 üblich:
erst das niedrige Byte (Bit 0-7), dann das hohe Byte (Bit 8-15).
In MADS (in unserem ersten Beispiel):
.word %1000100101100001 oder
dta a($8961)-> im Speicher: $61, $89
==========================================================
2. DIE SCHALTERBANK IM ÜBERBLICK
==========================================================
Hohes Byte (Bit 15 bis 8)
+-----+-----+-----+-----+-------+--------+--------+--------+
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
| END | - | LR | HR | OVATT | MAPPAR | MAPADR | CHBASE |
+-----+-----+-----+-----+-------+--------+--------+--------+
Niedriges Byte (Bit 7 bis 0)
+--------+-------+------+--------+-------+-------+------+------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| OVSCRL | OVADR | RPTL | MAPOFF | MAPON | OVOFF | GMON | TMON |
+--------+-------+------+--------+-------+-------+------+------+
Bit Name Wert Zusatz-Bytes
--- ------ ----- ------------
0 TMON $0001 -
1 GMON $0002 -
2 OVOFF $0004 -
3 MAPON $0008 -
4 MAPOFF $0010 -
5 RPTL $0020 1
6 OVADR $0040 5
7 OVSCRL $0080 2
8 CHBASE $0100 1
9 MAPADR $0200 5
10 MAPPAR $0400 4
11 OVATT $0800 2
12 HR $1000 -
13 LR $2000 -
14 - $4000 - (unbenutzt)
15 END $8000 -
==========================================================
3. JEDES BIT IM DETAIL
==========================================================
Die Bits sind hier von Bit 0 aufwärts sortiert, also genau in der
Reihenfolge, in der auch die Zusatz-Bytes gelesen werden.
Bit 0 TMON ($0001) Textmodus an Zusatz: keine
Was es macht:
Das Overlay wird ab dieser Zeile als Textbildschirm gezeichnet.
Wie der Text aufgebaut ist:
- Jedes Zeichen ist 8 x 8 Punkte gross.
- Bei normaler Breite passen 80 Zeichen in eine Zeile.
- Jedes Zeichen braucht im Bildspeicher 2 Bytes:
Byte 1 = Zeichencode (welcher Buchstabe)
Byte 2 = Farbe (Nummer in der Palette)
Darum ist bei 80 Zeichen die Schrittweite 160 Bytes.
- Eine Textzeile ist 8 Bildzeilen hoch. Mit RPTL = 7 (also 8 Zeilen)
bekommt man genau eine Textzeile.
Was man dazu braucht:
- OVADR: wo der Text im VRAM liegt
- CHBASE: wo der Zeichensatz liegt
- meistens OVATT: Breite, Palette, Priorität
Bei uns: Befehl 2 hat TMON an -> unser "HALLO WELT!".
Achtung: TMON und GMON nicht gleichzeitig einschalten. Es ist entweder Text oder Grafik.
Bit 1 GMON ($0002) Grafikmodus an Zusatz: keine
Was es macht:
Das Overlay wird als Bitmap gezeichnet: Jeder Bildpunkt hat seine eigene
Farbe, direkt aus dem Bildspeicher.
Wie viele Punkte, wie viele Farben? Das bestimmen HR und LR (Bit 12/13):
weder HR noch LR 320 Punkte, 1 Byte pro Punkt, 256 Farben
-> 320 Bytes pro Zeile
LR 160 Punkte, 1 Byte pro Punkt, 256 Farben
-> 160 Bytes pro Zeile
HR 640 Punkte, 4 Bit pro Punkt, 16 Farben
-> 320 Bytes pro Zeile
Was man dazu braucht:
- OVADR: Adresse des Bildes und Schrittweite (meist = Bytes pro Zeile)
- RPTL: für wie viele Zeilen
Beispiel: Ein Vollbild mit 320 x 200 Punkten in 256 Farben:
GMON | RPTL | OVADR, RPTL = 199, Schrittweite = 320
-> braucht 64.000 Bytes VRAM.
Bit 2 OVOFF ($0004) Overlay aus Zusatz: keine
Was es macht:
In diesen Bildzeilen zeichnet die VBXE kein Overlay. Man sieht nur das,was ANTIC und GTIA liefern (oder bei abgeschaltetem ANTIC: Hintergrund).
Wofür:
- Leerzeilen oben, damit das eigentliche Bild weiter unten anfängt
- Bereiche, in denen das normale Atari-Bild sichtbar bleiben soll
Bei uns: Befehl 1 = OVOFF | RPTL mit 111 -> 112 leere Bildzeilen, damit unsere Textzeile etwa in der Bildmitte steht.
Bit 3 MAPON ($0008) Farbmap an Zusatz: keine
Was es macht:
Schaltet die Farbmap (Attribut-Map) ein. Die Farbmap ist ein zweites Raster, das über das Bild gelegt wird. Es teilt den Bildschirm in Kästchen (Zellen). Für jedes Kästchen kann man eigene Farben und Einstellungen festlegen.
Wofür:
Vor allem, um das normale ANTIC-Bild bunter zu machen: Die Farben der Playfield-Register können pro Kästchen anders sein. So bekommt z.B. ein GRAPHICS-Modus viel mehr Farben als normal.
Was man dazu braucht:
- MAPADR: wo die Farbmap im VRAM liegt
- MAPPAR: wie gross die Kästchen sind und wie gescroll
wird
Hinweis: MAPON muss man nur einmal setzen. Die Map bleibt an, bis MAPOFF kommt.
Bit 4 MAPOFF ($0010) Farbmap aus Zusatz: keine
Was es macht:
Das Gegenstück zu MAPON: Ab hier ist die Farbmap wieder aus.
Wofür:
Wenn nur ein Teil des Bildschirms (z.B. ein Spielfeld oben) die Farbmap benutzen soll und der Rest (z.B. eine Statuszeile) nicht.
Achtung: MAPON und MAPOFF nie gleichzeitig setzen.
Bit 5 RPTL ($0020) Zeilen wiederholen Zusatz: 1 Byte
Was es macht:
Legt fest, für wie viele Bildzeilen dieser Befehl gilt.
Das Zusatz-Byte:
Anzahl der Bildzeilen MINUS 1
0 -> 1 Zeile
7 -> 8 Zeilen (eine Textzeile)
111 -> 112 Zeilen
255 -> 256 Zeilen (Maximum mit einem Befehl)
Ohne RPTL:
Der Befehl gilt nur für genau 1 Bildzeile, danach kommt sofort der nächste Befehl.
Wofür:
Fast immer. Ohne RPTL bräuchte man für jedes Bild hunderte Befehle.
Ohne RPTL zu arbeiten lohnt sich nur, wenn man wirklich jede Zeile anders einstellen will (z.B. für Effekte).
Bei uns: Befehl 1: 111 (112 Leerzeilen), Befehl 2: 7 (8 Textzeilen).
Bit 6 OVADR ($0040) Bildspeicher-Adresse Zusatz: 5 Bytes
Was es macht:
Sagt der VBXE, wo im VRAM die Daten für das Overlay liegen, und wie weit sie von einer Zeile zur nächsten springen soll.
Die 5 Zusatz-Bytes:
Byte 1 Adresse Bits 0-7
Byte 2 Adresse Bits 8-15
Byte 3 Adresse Bits 16-18 (das VRAM ist bis 512 KB gross)
Byte 4 Schrittweite, niedriges Byte
Byte 5 Schrittweite, hohes Byte
Die Schrittweite:
So viele Bytes geht die VBXE nach jeder Zeile weiter. Normalerweise ist das genau die Länge einer Zeile:
Text 80 Zeichen -> 160
Grafik 320 Punkte -> 320
Grafik 160 Punkte -> 160
Ist die Schrittweite größer als eine Zeile, ist das Bild im Speicher breiter als der Bildschirm. Dann kann man waagerecht darin herumscrollen, indem man nur die Adresse ändert.
Bei uns: 0, 1, 0 -> VRAM $000100
.word 160 -> 160 Bytes pro Textzeile
Tipp: Will man mitten im Bild auf einen anderen Speicherbereich umschalten (z.B. eine feste Statuszeile unter einem Scroll-Bild),gibt man einfach im nächsten Befehl wieder OVADR an.
Bit 7 OVSCRL ($0080) Feinscrolling Zusatz: 2 Bytes
Was es macht:
Verschiebt das Overlay punktgenau, damit Scrolling weich läuft und nicht in ganzen Zeichen oder Bytes springt.
Die 2 Zusatz-Bytes:
Byte 1 waagerechter Feinscroll (um wie viele Punkte nach links)
Byte 2 senkrechter Feinscroll (bei Text: ab welcher der 8 Punktzeilen eines Zeichens begonnen wird)
Wofür:
Grobes Scrollen macht man über die Adresse (OVADR), das feine Scrollen zwischen zwei Schritten über OVSCRL. Das ist dasselbe Prinzip wie HSCROL und VSCROL beim ANTIC.
Bei uns: nicht benutzt.
Bit 8 CHBASE ($0100) Zeichensatz-Adresse Zusatz: 1 Byte
Was es macht:
Sagt der VBXE, wo im VRAM der Zeichensatz für den Textmodus liegt.
Das Zusatz-Byte:
Die Adresse in Schritten von 2 KB (2048 Bytes):
0 -> $00000
1 -> $00800
2 -> $01000
...
Der Zeichensatz muss also immer an einer 2-KB-Grenze beginnen.
Aufbau:
8 Bytes pro Zeichen, ein Byte pro Punktzeile, wie beim normalen Atari.
Man kann einfach den Zeichensatz aus dem Atari-ROM ins VRAM kopieren,oder einen eigenen entwerfen.
Bei uns: 1 -> Zeichensatz bei VRAM $0800 (den ROM-Zeichensatz haben wir dorthin kopiert).
Hinweis: Nur für den Textmodus (TMON) wichtig.
Bit 9 MAPADR ($0200) Farbmap-Adresse Zusatz: 5 Bytes
Was es macht:
Wie OVADR, nur für die Farbmap: Wo liegt sie im VRAM und wie weit geht es pro Kästchen-Zeile weiter.
Die 5 Zusatz-Bytes:
Byte 1-3 Adresse der Farbmap (Bits 0-7, 8-15, 16-18)
Byte 4-5 Schrittweite (niedriges, hohes Byte)
Aufbau der Farbmap:
Jedes Kästchen belegt 4 Bytes. Darin stehen Farben fuer die Playfield-Farben und ein Byte mit weiteren Einstellungen für dieses Kästchen.
Bei uns: nicht benutzt.
Bit 10 MAPPAR ($0400) Farbmap-Einstellungen Zusatz: 4 Bytes
Was es macht:
Legt fest, wie die Kästchen der Farbmap aussehen und wo sie stehen.
Die 4 Zusatz-Bytes:
Byte 1 waagerechter Scrollwert der Map
Byte 2 senkrechter Scrollwert der Map
Byte 3 Breite eines Kästchens (Wert + 1 Punkte, bis 32)
Byte 4 Höhe eines Kästchens (Wert + 1 Zeilen, bis 32)
Beispiel: Kästchen 8 x 8 Punkte -> Byte 3 = 7, Byte 4 = 7.
Das passt genau zu den Zeichen eines Textmodus.
Bei uns: nicht benutzt.
Bit 11 OVATT ($0800) Overlay-Eigenschaften Zusatz: 2 Bytes
Was es macht:
Stellt Breite, Paletten und Priorität des Overlays ein.
Byte 1: Breite und Paletten
Bits 0-1 Breite des Overlays
0 = schmal (256 Punkte)
1 = normal (320 Punkte)
2 = breit (336 Punkte)
Bits 2-3 unbenutzt
Bits 4-7 zwei Palettennummern (0-3), je 2 Bits:
eine für das Playfield (ANTIC-Bild), eine für das Overlay.
Laut VBXE-Doku: Bits 4-5 = Playfield, Bits 6-7 = Overlay.
Die VBXE hat 4 Paletten mit je 256 Farben. Palette 0 ist beim Start mit
den Atari-Farben belegt. Die anderen füllt man selbst über PSEL, CSEL und CR/CG/CB.
Byte 2: Priorität
Legt fest, ob das Overlay vor oder hinter den anderen Bildteilen liegt
(Playfield-Farben und Player/Missiles). Jedes Bit steht für einen Bildteil, 1 = Overlay liegt davor.
$FF -> Overlay liegt vor allem anderen
$00 -> Overlay liegt hinter allem
Bei uns: 17 ($11) und 255 ($FF).
Bit 12 HR ($1000) Hohe Auflösung Zusatz: keine
Was es macht:
Grafikmodus mit 640 Punkten pro Zeile. Dafür hat jeder Punkt nur 4 Bit,
also 16 Farben. Ein Byte enthält 2 Punkte.
Nur sinnvoll mit GMON.
Bit 13 LR ($2000) Niedrige Auflösung Zusatz: keine
Was es macht:
Grafikmodus mit nur 160 Punkten pro Zeile, jeder Punkt doppelt so breit.
Weiterhin 1 Byte pro Punkt, also 256 Farben. Spart Speicher und ist schneller zu bemalen.
Nur sinnvoll mit GMON.
Merke zu HR und LR:
beide aus = normal, 320 Punkte, 256 Farben (Normalfall)
LR an = 160 Punkte
HR an = 640 Punkte, 16 Farben
beide an = nicht erlaubt
Bit 14 (unbenutzt) ($4000) Zusatz: keine
Ohne Funktion. Immer 0 lassen, damit spätere VBXE-Versionen nicht überrascht werden.
Bit 15 END ($8000) Ende der XDL Zusatz: keine
Was es macht:
Kennzeichnet den letzten Befehl der Liste. Wenn seine Zeilen abgelaufen sind, liest die VBXE in diesem Bild keine weiteren Befehle mehr. Beim nächsten Bild fängt sie wieder vorne bei XDL_ADR an.
Ohne END:
Die VBXE würde einfach weiterlesen und den Speicher hinter der XDL als Befehle deuten. Das gibt ein wildes Bild.
Bei uns: Befehl 2 hat END an. Befehl 1 nicht, weil danach noch etwas kommt.
==========================================================
4. TYPISCHE KOMBINATIONEN
==========================================================
a) Leerzeilen
OVOFF | RPTL + 1 Byte
-> z.B. Platz oben schaffen (unser Befehl 1)
b) Textbereich
TMON | RPTL | OVADR | CHBASE | OVATT + 1 + 5 + 1 + 2 Bytes
-> unser Befehl 2 (mit END)
c) Vollbild-Grafik 320 x 200, 256 Farben
GMON | RPTL | OVADR | OVATT | END + 1 + 5 + 2 Bytes
RPTL = 199, Schrittweite 320
d) Bild oben, Statuszeile unten
Befehl 1: GMON | RPTL | OVADR ... (das Bild)
Befehl 2: TMON | RPTL | OVADR | CHBASE | END (die Statuszeile)
-> zweites OVADR zeigt auf den Text der Statuszeile
e) Weich scrollendes Bild
Pro Bild ändert das Programm im VBI die OVADR-Bytes (grob)
und die OVSCRL-Bytes (fein) direkt in der XDL im VRAM.
==========================================================
5. HÄUFIGE FEHLER
==========================================================
- Zusatz-Bytes in falscher Reihenfolge
-> immer von Bit 0 aufwärts: RPTL, OVADR, OVSCRL, CHBASE, MAPADR, MAPPAR, OVATT
- Ein Bit gesetzt, aber die Bytes dazu vergessen (oder umgekehrt)
-> alle folgenden Befehle verrutschen
- RPTL mit der echten Zeilenzahl statt Zeilen MINUS 1
-> eine Zeile zu viel
- END vergessen
-> VBXE liest Datenmüll als Befehle
- Schrittweite passt nicht zum Modus
-> Bild schief oder verzerrt
- Zeichensatz nicht an 2-KB-Grenze oder nicht ins VRAM kopiert
-> nur Kästchen oder Müll statt Buchstaben
- TMON und GMON gleichzeitig, oder HR und LR gleichzeitig
-> nicht erlaubt
==========================================================
6. KURZ-ÜBERSICHT
==========================================================
Bit Name Wert Bytes Kurz
--- ------ ----- ----- ---------------------------
0 TMON $0001 - Text
1 GMON $0002 - Grafik
2 OVOFF $0004 - Overlay aus
3 MAPON $0008 - Farbmap an
4 MAPOFF $0010 - Farbmap aus
5 RPTL $0020 1 Zeilen - 1
6 OVADR $0040 5 Adresse (3)+Schrittweite(2)
7 OVSCRL $0080 2 Feinscroll waag. / senkr.
8 CHBASE $0100 1 Zeichensatz / 2048
9 MAPADR $0200 5 Map-Adresse (3) + Schrittweite (2)
10 MAPPAR $0400 4 Map-Scroll (2) + Kästchengrösse (2)
11 OVATT $0800 2 Breite/Paletten + Priorität
12 HR $1000 - 640 Punkte, 16 Farben
13 LR $2000 - 160 Punkte
14 - $4000 - unbenutzt
15 END $8000 - Ende der XDL
==========================================================
Alle "Schalter", die in uunserem ersten Beispiel "Hallo Welt" noch nicht benutzt worden sind, werden später noch genauer und ausführlicher mit Beispielen erklärt!